package com.mzx.javase.集合.泛型;

import sun.misc.PostVMInitHook;

import java.util.ArrayList;
import java.util.List;

/**
 * 类描述：泛型通配符的介绍
 *  当我们在使用泛型类或通配符时,不确定传递具体参数的类型,可以用<?>来表示,但是一旦使用了泛型通配符之后,只能使用object类中共有的
 *  共性方法,集合中元素自身方法无法使用
 * @ClassName GenericWildCard
 * @Description TODO
 * @Author 69417
 * @Date 2022/7/3 17:22
 * @Version 1.0
 */
public class GenericWildCard {

    public static void test01(List<?> list) {

    }

    public static void test02(List<Object> list) {

    }

    //此处声明代表通配符中只能传递person或person的子类
    public static void test03(List<? extends Person> list) {

    }

    //此处声明代表只能传递student或student的父类
    public static void test04(List<? super Person> list) {

    }

    //?：通配符，不确定类型，代表集合中可以存储任意类型的数据。
    public static void main(String[] args) {
    /*
     * ? extends E
        限定了上限，集合的泛型：E以及E的子类
     *
     * ? super E
     * 限定了下限,只能是E及E的父类
     **/
        String s = new String("1");
        ArrayList<String> stringArrayList = new ArrayList<>();
        stringArrayList.add(s);
        test01(stringArrayList);

        Person person = new Person();
        ArrayList<Object> personArrayList = new ArrayList<>();
        personArrayList.add(person);
        test02(personArrayList);

        List<Person> test03list= new ArrayList<>();

        test03(test03list);
        List<Student> test04list = new ArrayList<>();
        //只能接受本身类型或者父类
        //test04(test04list);

    }
}
class Person{}
class Student extends Person{}

